#include<etcd/Client.hpp>
#include<etcd/KeepAlive.hpp>
#include<etcd/Response.hpp>
#include<etcd/SyncClient.hpp>
#include<etcd/Value.hpp>
#include<etcd/Watcher.hpp>
#include<unistd.h>
#include<iostream>
//键值对信息变动回调
void callback(const etcd::Response&resp){
    if(resp.is_ok()==false){
        std::cout<<"事件监控错误："<<resp.error_message()<<std::endl;
        return ;
    }
    for(auto const&ev:resp.events()){
        if(ev.event_type()==etcd::Event::EventType::PUT){
            std::cout<<"服务信息发生了改变:"<<std::endl;
            std::cout<<"当前的值："<<ev.kv().key()<<"- "<<ev.kv().as_string()<<std::endl;
            std::cout<<"原来的值："<<ev.prev_kv().key()<<"- "<<ev.kv().as_string()<<std::endl;
        }
        else if(ev.event_type()==etcd::Event::EventType::DELETE_){
            std::cout<<"服务信息下线被删除："<<std::endl;
            std::cout<<"当前的值："<<ev.kv().key()<<"- "<<ev.kv().as_string()<<std::endl;
            std::cout<<"原来的值："<<ev.prev_kv().key()<<"- "<<ev.kv().as_string()<<std::endl;
        }
    }
}
int main(int argc,char*argv[]){
    std::string etcd_host="http://127.0.0.1:2379";//etcd服务器地址信息
    //实例化客户端对象
    etcd::Client client(etcd_host);
    //获取指定键值对信息
    auto resp=client.ls("/server").get();//获取/server目录下的所有数据列表
    if(resp.is_ok()==false){
        std::cout<<"数据获取失败: "<<resp.error_message()<<std::endl;
        return -1;
    }

    //成功，遍历服务
    int sz=resp.keys().size();
    for(int i=0;i<sz;i++){
        std::cout<<resp.value(i).as_string()<<"可以提供"<<resp.key(i)<<"服务"<<std::endl;
    }

    //创建键值对监控对象
    etcd::Watcher watcher(etcd_host,"/server",callback,true);//true递归监控该目录下所有的键值对变化
    watcher.Wait();
    return 0;
}